import axios from "axios";
import { toast } from "./composables/util";
import { getToken } from './composables/auth'
import store from './store'


// 基础service配置
const baseService = axios.create({
  validateStatus: function (status) {
    return status >= 200 && status <= 500;
  },
});

// 创建可配置baseURL的service实例
export function createService(baseURL = "/api") {
  const service = axios.create({
    baseURL,
    validateStatus: baseService.defaults.validateStatus,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });

  // 复制拦截器
  service.interceptors.request = baseService.interceptors.request;
  service.interceptors.response = baseService.interceptors.response;

  return service;
}

// 默认使用/api的service实例
const service = createService();

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken()
    if(token) {
        config.headers["token"] = token
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器，即使状态码为400，也能获取响应体
service.interceptors.response.use(
  (response) => {
    // 成功响应处理
    if (response.status == 200) {
      return response.data || response;
    } else {
      const msg = response.data.msg || response.statusText
      const code = response.data.code
      if (!response.config.noTip) {
        toast(msg, "error")
      }
      if(msg == '非法token，请先登录！' || code == '2000') {
        store.commit('REMOVE_USERINFO')
        location.reload()
      }
      return Promise.reject(response.data || response);
    }
  },
  (error) => {
    // 如果状态码为400，则从错误响应中提取body
    if (error.response && error.response.status === 400) {
      return error.response;
    }
    
    // 捕获所有未处理的错误
    if (error.cmd === 'beacon-report-mes') {
      // console.error('Beacon reporting error:', error.err);
      return Promise.resolve(); // 静默处理
    }
    
    // 其他未处理错误
    if (!error.config?.noTip) {
      toast('请求失败，请稍后重试', 'error');
    }
    return Promise.reject(error);
  }
);

export default service;
